home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 March / macformat-022.iso / Shareware City / Developers / MW MPW Binaries 1.1.1a2 / mwcPPC / MWCIncludes / string < prev    next >
Encoding:
Text File  |  1994-07-18  |  6.1 KB  |  182 lines  |  [TEXT/MMCC]

  1. // string standard header
  2. #ifndef _STRING_
  3. #define _STRING_
  4. #include <istream>
  5. #include <ostream>
  6.  
  7. #if __MWERKS__
  8. #pragma options align=mac68k
  9. #endif
  10.  
  11.         // class string
  12. class string {
  13. public:
  14.     string()
  15.         {_Tidy(); }
  16.     string(size_t _N, capacity _C)
  17.         {_Tidy(), _Res = _N;
  18.         if (_C == default_size)
  19.             assign('\0', _N); }
  20.     string(const string& _X, size_t _P = 0, size_t _N = NPOS)
  21.         {_Tidy(), assign(_X, _P, _N); }
  22.     string(const char *_S, size_t _N = NPOS)
  23.         {_Tidy(), assign(_S, _N); }
  24.     string(char _C, size_t _N = 1)
  25.         {_Tidy(), assign(_C, _N); }
  26.     string(unsigned char _C, size_t _N = 1)
  27.         {_Tidy(), assign((char)_C, _N); }
  28. #if _SIGNED_CHAR_IS_DISTINCT
  29.     string(signed char _C, size_t _N = 1)
  30.         {_Tidy(), assign((char)_C, _N); }
  31. #endif /* _SIGNED_CHAR_IS_DISTINCT */
  32.     ~string()
  33.         {_Tidy(1); }
  34.     string& operator=(const string& _X)
  35.         {return (assign(_X)); }
  36.     string& operator=(const char *_S)
  37.         {return (assign(_S)); }
  38.     string& operator=(char _C)
  39.         {return (assign(_C)); }
  40.     string& operator+=(const string& _X)
  41.         {return (append(_X)); }
  42.     string& operator+=(const char *_S)
  43.         {return (append(_S)); }
  44.     string& operator+=(char _C)
  45.         {return (append(_C)); }
  46.     string& append(const string&, size_t = 0, size_t = NPOS);
  47.     string& append(const char *, size_t = NPOS);
  48.     string& append(char, size_t = 1);
  49.     string& assign(const string&, size_t = 0, size_t = NPOS);
  50.     string& assign(const char *, size_t = NPOS);
  51.     string& assign(char, size_t = 1);
  52.     string& insert(size_t, const string&, size_t = 0,
  53.         size_t = NPOS);
  54.     string& insert(size_t, const char *, size_t = NPOS);
  55.     string& insert(size_t, char, size_t = 1);
  56.     string& remove(size_t = 0, size_t = NPOS);
  57.     string& replace(size_t, size_t, const string&,
  58.         size_t = 0, size_t = NPOS);
  59.     string& replace(size_t, size_t, const char *,
  60.         size_t = NPOS);
  61.     string& replace(size_t, size_t, char, size_t = 1);
  62.     char get_at(size_t) const;
  63.     void put_at(size_t, char);
  64.     char operator[](size_t _N) const
  65.         {return (_Ptr[_N]); }
  66.     char& operator[](size_t _N)
  67.         {return (_Ptr[_N]); }
  68.     const char *c_str() const
  69.         {return (_Ptr != 0 ? _Ptr : ""); }
  70.     size_t length() const
  71.         {return (_Len); }
  72.     void resize(size_t _N, char _C = 0)
  73.         {_N <= _Len ? remove(_N) : append(_C, _N - _Len); }
  74.     size_t reserve() const
  75.         {return (_Res); }
  76.     void reserve(size_t _N)
  77.         {if (_Ptr == 0)
  78.             _Res = _N; }
  79.     size_t copy(char *, size_t, size_t = 0);
  80.     size_t find(const string& _X, size_t _P = 0) const
  81.         {return (find(_X.c_str(), _P, _X.length())); }
  82.     size_t find(const char *_S, size_t _P = 0,
  83.         size_t _N = NPOS) const;
  84.     size_t find(char _C, size_t _P = 0) const
  85.         {return (find((const char *)&_C, _P, 1)); }
  86.     size_t rfind(const string& _X, size_t _P = NPOS) const
  87.         {return (rfind(_X.c_str(), _P, _X.length())); }
  88.     size_t rfind(const char *, size_t = NPOS, size_t = NPOS)
  89.         const;
  90.     size_t rfind(char _C, size_t _P = NPOS) const
  91.         {return (rfind((const char *)&_C, _P, 1)); }
  92.     size_t find_first_of(const string& _X, size_t _P = 0) const
  93.         {return (find_first_of(_X.c_str(), _P, _X.length())); }
  94.     size_t find_first_of(const char *, size_t = 0,
  95.         size_t = NPOS) const;
  96.     size_t find_first_of(char _C, size_t _P = 0) const
  97.         {return (find((const char *)&_C, _P, 1)); }
  98.     size_t find_last_of(const string& _X, size_t _P = NPOS)
  99.         const
  100.         {return (find_last_of(_X.c_str(), _P, _X.length())); }
  101.     size_t find_last_of(const char *, size_t = NPOS,
  102.         size_t = NPOS) const;
  103.     size_t find_last_of(char _C, size_t _P = NPOS) const
  104.         {return (rfind((const char *)&_C, _P, 1)); }
  105.     size_t find_first_not_of(const string& _X,
  106.         size_t _P = 0) const
  107.         {return (find_first_not_of(_X.c_str(), _P,
  108.             _X.length())); }
  109.     size_t find_first_not_of(const char *, size_t = 0,
  110.         size_t = NPOS) const;
  111.     size_t find_first_not_of(char _C, size_t _P = 0) const
  112.         {return (find_first_not_of((const char *)&_C, _P, 1)); }
  113.     size_t find_last_not_of(const string& _X,
  114.         size_t _P = NPOS) const
  115.         {return (find_last_not_of(_X.c_str(), _P,
  116.             _X.length())); }
  117.     size_t find_last_not_of(const char *, size_t = NPOS,
  118.         size_t = NPOS) const;
  119.     size_t find_last_not_of(char _C, size_t _P = NPOS) const
  120.         {return (find_last_not_of((const char *)&_C, _P, 1)); }
  121.     string substr(size_t _P = 0, size_t _N = NPOS) const
  122.         {return (string(*this, _P, _N)); }
  123.     int compare(const string&, size_t = 0, size_t = NPOS) const;
  124.     int compare(const char *, size_t = 0, size_t = NPOS) const;
  125.     int compare(char, size_t = 0, size_t = 1) const;
  126. private:
  127.     _Bool _Grow(size_t, _Bool = 0);
  128.     void _Tidy(_Bool = 0);
  129.     void _Xlen() const
  130.         {lengtherror("string too long").raise(); }
  131.     void _Xran() const
  132.         {outofrange("invalid string position").raise(); }
  133.     char *_Ptr;
  134.     size_t _Len, _Res;
  135.     };
  136. inline string operator+(const string& _L, const string& _R)
  137.     {return (string(_L) += _R); }
  138. inline string operator+(const char *_L, const string& _R)
  139.     {return (string(_L) += _R); }
  140. inline string operator+(char _L, const string& _R)
  141.     {return (string(_L) += _R); }
  142. inline string operator+(const string& _L, const char *_R)
  143.     {return (string(_L) += _R); }
  144. inline string operator+(const string& _L, char _R)
  145.     {return (string(_L) += _R); }
  146. inline _Bool operator==(const string& _L, const string& _R)
  147.     {return (_L.compare(_R) == 0); }
  148. inline _Bool operator==(const char * _L, const string& _R)
  149.     {return (_R.compare(_L) == 0); }
  150. inline _Bool operator==(char _L, const string& _R)
  151.     {return (_R.compare(_L) == 0); }
  152. inline _Bool operator==(const string& _L, const char *_R)
  153.     {return (_L.compare(_R) == 0); }
  154. inline _Bool operator==(const string& _L, char _R)
  155.     {return (_L.compare(_R) == 0); }
  156. inline _Bool operator!=(const string& _L, const string& _R)
  157.     {return (!(_L == _R)); }
  158. inline _Bool operator!=(const char *_L, const string& _R)
  159.     {return (!(_L == _R)); }
  160. inline _Bool operator!=(char _L, const string& _R)
  161.     {return (!(_L == _R)); }
  162. inline _Bool operator!=(const string& _L, const char *_R)
  163.     {return (!(_L == _R)); }
  164. inline _Bool operator!=(const string& _L, char _R)
  165.     {return (!(_L == _R)); }
  166. istream& operator>>(istream&, string&);
  167. istream& getline(istream&, string&, char = '\n');
  168. inline ostream& operator<<(ostream& _O, const string& _X)
  169.     {return (_O.write(_X.c_str(), _X.length())); }
  170.  
  171. #if __MWERKS__
  172. #pragma options align=reset
  173. #endif
  174.  
  175. #endif
  176.  
  177. /*
  178.  * Copyright (c) 1994 by P.J. Plauger.  ALL RIGHTS RESERVED. 
  179.  * Consult your license regarding permissions and restrictions.
  180.  */
  181.  
  182.